package com.freecat.xmqgct.mvp.presenter;

import android.text.TextUtils;

import com.freecat.xmqgct.mvp.bean.StatisticsBean;
import com.freecat.xmqgct.mvp.model.MainRepository;
import com.freecat.xmqgct.mvp.model.entity.BaseResponse;
import com.freecat.xmqgct.mvp.model.entity.FileBean;
import com.freecat.xmqgct.mvp.model.entity.PageLIST;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import me.jessyan.art.di.component.AppComponent;
import me.jessyan.art.mvp.BasePresenter;
import me.jessyan.art.mvp.Message;
import me.jessyan.rxerrorhandler.core.RxErrorHandler;
import me.jessyan.rxerrorhandler.handler.ErrorHandleSubscriber;
import me.jessyan.rxerrorhandler.handler.RetryWithDelay;
import okhttp3.MultipartBody;


/**
 * ================================================
 * Description:
 * <p>
 * Created by MVPArtTemplate on 09/17/2019 14:58
 * <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
 * <a href="https://github.com/JessYanCoding">Follow me</a>
 * <a href="https://github.com/JessYanCoding/MVPArt">Star me</a>
 * <a href="https://github.com/JessYanCoding/MVPArms/wiki">See me</a>
 * <a href="https://github.com/JessYanCoding/MVPArmsTemplate">模版请保持更新</a>
 * ================================================
 */


public class MainPresenter extends BasePresenter<MainRepository> {


    public static final int UPLOAD = 21;


    private RxErrorHandler mErrorHandler;



    GsonBuilder builder=new GsonBuilder();
    Gson gson=builder.create();

    public MainPresenter(AppComponent appComponent) {
        super(appComponent.repositoryManager().createRepository(MainRepository.class));
        this.mErrorHandler = appComponent.rxErrorHandler();
    }

    public void upload(Message message) {
        Object[] objs = message.objs;
        MultipartBody.Part obj = (MultipartBody.Part) objs[1];
        String rybh = (String) objs[0];
        int type = (int) objs[2];
        String xmbh = (String) objs[3];
        mModel.upload(rybh, xmbh, obj)
                .subscribeOn(Schedulers.io())
                .retryWhen(new RetryWithDelay(2, 3))
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        addDispose(disposable);
                        message.getTarget().showLoading();
                    }
                })
                .subscribeOn(AndroidSchedulers.mainThread())
                .observeOn(AndroidSchedulers.mainThread())
                .doFinally(new Action() {
                    @Override
                    public void run() throws Exception {
                        message.getTarget().hideLoading();
                        message.recycle();
                    }
                })
                .subscribe(new ErrorHandleSubscriber<BaseResponse<FileBean>>(mErrorHandler) {
                    @Override
                    public void onNext(BaseResponse<FileBean> response) {
                       if ("200".equals(response.getCode())) {

                           JsonObject jso=response.getResult();
                           System.out.println("json========="+jso.get("data"));
                           message.obj = gson.fromJson(jso.get("data").getAsJsonObject(), FileBean.class);
                            message.what = UPLOAD;
                            message.arg1 = type;
                           message.handleMessageToTargetUnrecycle();
                        } else {
                            if (TextUtils.isEmpty(response.getMsg())) {
                                message.getTarget().showMessage("请求失败"+response.getMsg());
                            } else {
                                message.getTarget().showMessage(response.getMsg());
                            }
                        }
                    }
                });
    }



    /*
    集中适配JARR方法
    * */
    public List GetObjetList(JsonObject jsob,List lists,int type){


//        if (jsob.has("data")&&jsob.get("data")!=null&&jsob.get("data").toString().length()>5){
//            switch (type){
//
//                case 1:
//                    JsonArray arry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : arry) {
//                        lists.add(gson.fromJson(jsonElement,ProjectBean.class));
//                    }
//                    break;
//                case 2:
//                    JsonArray TempArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : TempArry) {
//                        lists.add(gson.fromJson(jsonElement,TemplateBean.class));
//                    }
//                    break;
//
//                case 3:
//                    JsonArray QxBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : QxBeanArry) {
//                        lists.add(gson.fromJson(jsonElement,QxBean.class));
//                    }
//                    break;
//                case 4:
//                    JsonArray JsRyBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : JsRyBeanArry) {
//                        lists.add(gson.fromJson(jsonElement,JsryBeam.class));
//                    }
//                    break;
//                case 5:
//                    JsonArray LwDwBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : LwDwBeanArry) {
//                        lists.add(gson.fromJson(jsonElement,LwdwBean.class));
//                    }
//                    break;
//                case 6:
//                    JsonArray MessageLISTbeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : MessageLISTbeanArry) {
//                        lists.add(gson.fromJson(jsonElement,MessageBean.class));
//                    }
//                    break;
//                case 7:
//                    JsonArray TemplateLISTbeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : TemplateLISTbeanArry) {
//                        lists.add(gson.fromJson(jsonElement,TemplateBean.class));
//                    }
//                    break;
//                case 8:
//                    JsonArray SystemCodeBeanLISTbeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : SystemCodeBeanLISTbeanArry) {
//                        lists.add(gson.fromJson(jsonElement,SystemCodeBean.class));
//                    }
//                    break;
//                case 9:
//                    JsonArray SurverPointListBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : SurverPointListBeanArry) {
//                        lists.add(gson.fromJson(jsonElement,SurveyPointBean.class));
//                    }
//                    break;
//                case 10:
//                    JsonArray FileBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : FileBeanArry) {
//                        lists.add(gson.fromJson(jsonElement,FileBean.class));
//                    }
//                    break;
//                case 11:
//                    JsonArray RecordNumBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : RecordNumBeanArry) {
//                        lists.add(gson.fromJson(jsonElement,RecordNumBean.class));
//                    }
//                    break;
//                case 12:
//                    JsonArray PiercebeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : PiercebeanArry) {
//                        lists.add(gson.fromJson(jsonElement,PierceBean.class));
//                    }
//                    break;
//                case 13:
//                    JsonArray DynamicBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : DynamicBeanArry) {
//                        lists.add(gson.fromJson(jsonElement,DynamicBean.class));
//                    }
//                    break;
//                case 14:
//                    JsonArray SwlistArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : SwlistArry) {
//                        lists.add(gson.fromJson(jsonElement,SwcsListBean.class));
//                    }
//                    break;
//                case 15:
//                    JsonArray WaveArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : WaveArry) {
//                        lists.add(gson.fromJson(jsonElement,WaveListBean.class));
//                    }
//                    break;
//                case 16:
//                    JsonArray HcjlArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : HcjlArry) {
//                        lists.add(gson.fromJson(jsonElement, HcjlBean.class));
//                    }
//                    break;
//                case 17:
//                    JsonArray GeologyBeanAryy = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : GeologyBeanAryy) {
//                        lists.add(gson.fromJson(jsonElement, GeologyBean.class));
//                    }
//
//                    break;
//                case 18:
//                    JsonArray SurveyPointNumBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : SurveyPointNumBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, SurveyPointNumBean.class));
//                    }
//                    break;
//                case 19:
//                    JsonArray SamplingListBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : SamplingListBeanArry) {
////                    System.out.println("add_SamplingListBeanArry"+jsonElement.toString());
//                        lists.add(gson.fromJson(jsonElement, SamplingListBean.class));
//                    }
//                    break;
//                case 20:
//
//                    /*
//                     * :{"qyCnt":1,"kcdCnt":5,"qyKsCnt":3,"sysjList":[]},"pageNo":null,"p
//                     * */
////                System.out.println("jsob.get(\"data\").getAsJsonObject().get(\"sysjList\")"+jsob.get("data").getAsJsonObject().get("sysjList"));
////                System.out.println("qyCnt"+jsob.get("data").getAsJsonObject().get("qyCnt"));
////                System.out.println("kcdCnt"+jsob.get("data").getAsJsonObject().get("kcdCnt"));
////                System.out.println("qyKsCnt"+jsob.get("data").getAsJsonObject().get("qyKsCnt"));
//                    JsonArray SysjListBeanArry = new JsonParser().parse(jsob.get("data").getAsJsonObject().get("sysjList").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : SysjListBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, StatisticsBean.SysjListBean.class));
//                    }
//                    break;
//
//
//                case 21:
//
//                    JsonArray lwbeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : lwbeanArry) {
//                        lists.add(gson.fromJson(jsonElement, lwBean.class));
//                    }
//                    break;
//
//                case 22:
//
//                    JsonArray EntrustBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : EntrustBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, EntrustBean.class));
//                    }
//                    break;
//
//
//                case 23:
//
//                    JsonArray QybhArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : QybhArry) {
//                        lists.add(gson.fromJson(jsonElement, QyBhBean.class));
//                    }
//                    break;
//                case 25:
//
//                    JsonArray EarthDataBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : EarthDataBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, EarthDataBean.class));
//                    }
//                    break;
//                case 24:
//
//                    JsonArray RockDataBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : RockDataBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, RockDataBean.class));
//                    }
//                    break;
//
//                case 26:
//
//                    JsonArray WaterDataBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : WaterDataBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, WaterDataBean.class));
//                    }
//                    break;
//                case 27:
//
//                    JsonArray EntrustUnitArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : EntrustUnitArry) {
//                        lists.add(gson.fromJson(jsonElement, EntrustUnit.class));
//                    }
//                    break;
//                case 28:
//
//                    JsonArray CtssyBeantArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : CtssyBeantArry) {
//                        lists.add(gson.fromJson(jsonElement, CtssyBean.class));
//                    }
//                    break;
//                case 29:
//
//                    JsonArray CtssySysjBeantArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : CtssySysjBeantArry) {
//                        lists.add(gson.fromJson(jsonElement, CtssySysjBean.class));
//                    }
//                    break;
//
//                case 30:
//
//                    JsonArray YssyBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : YssyBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, YssyBean.class));
//                    }
//                    break;
//                case 31:
//                    JsonArray YssysjBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : YssysjBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, YssySysjBean.class));
//                    }
//                    break;
//                case 32:
//                    JsonArray ZssyBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : ZssyBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, ZssyBean.class));
//                    }
//                    break;
//                case 33:
//                    JsonArray ZssySysjBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : ZssySysjBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, ZssySysjBean.class));
//                    }
//                    break;
//                case 34:
//                    JsonArray ZssySysjTBeanArry = new JsonParser().parse(jsob.get("data").toString()).getAsJsonArray();
//                    for (JsonElement jsonElement : ZssySysjTBeanArry) {
//                        lists.add(gson.fromJson(jsonElement, ZssySysjTBean.class));
//                    }
//                    break;
//
//            }
//        }



        return  lists;
    }

    public  <T> T fromToJson(String json, Type listType){
        Gson gson = new Gson();
        T t = null;
        t = gson.fromJson(json,listType);
        return t;
    }

    public PageLIST PLload(JsonObject jsonObject, List Lists){

        PageLIST PL=new PageLIST();
        if (jsonObject.get("pageNo").toString()!=null){
            PL.setPageNo(jsonObject.get("pageNo").toString());
        }else {
            PL.setPageNo("10");
        }
        if (jsonObject.get("pageSize").toString()!=null){
            PL.setPageSize(jsonObject.get("pageSize").toString());
        }else {
            PL.setPageSize("1");
        }
        if (jsonObject.get("totalCount").toString()!=null){
            PL.setTotalCount(jsonObject.get("totalCount").toString());
        }else {
            PL.setTotalCount("10");
        }
        if (jsonObject.get("totalPage").toString()!=null){
            PL.setTotalPage(jsonObject.get("totalPage").toString());
        }else {
            PL.setTotalCount("1");
        }
        /*
        *  "zks": 7,
        "ywc": 1,
        "zjc": 0
        * */

        if (jsonObject.has("zks")){
            if (jsonObject.get("zks").toString()!=null){
                PL.setZks(jsonObject.get("zks").toString());
            }
        }

        if (jsonObject.has("ywc")){
            if (jsonObject.get("ywc").toString()!=null){
                PL.setYwc(jsonObject.get("ywc").toString());
            }
        }
        if (jsonObject.has("zjc")){
            if (jsonObject.get("zjc").toString()!=null){
                PL.setZjc(jsonObject.get("zjc").toString());
            }
        }




        PL.setObjectList(Lists);
        return  PL;
    }



    @Override
    public void onDestroy() {
        super.onDestroy();
        this.mErrorHandler = null;
    }
}